java枚举与前端的交互 您所在的位置:网站首页 枚举 jsp java枚举与前端的交互

java枚举与前端的交互

2023-09-02 09:42| 来源: 网络整理| 查看: 265

java后台与前端交互时,如果java参数属性是枚举类型,则交互时需要进行序列化与反序列化

 

当需要把枚举格式以"enum": {"code": "","message": ""}格式返回给前端时,需要使用到@JsonSerializer类进行序列化

Base枚举(所有枚举实现这个Base枚举,在做序列化处理时能够较好的进行枚举的纺一处理)

public interface BaseEnum getGenericClass(Class clazz) { return getGenericClass(clazz, 0); } public static Class getGenericClass(Class clazz, int index) { return getGenericClass(clazz.getGenericSuperclass(), index); } public static Class getGenericClass(Type genType, int index) { if (genType instanceof ParameterizedType) { ParameterizedType pramType = (ParameterizedType) genType; Type[] params = pramType.getActualTypeArguments(); if ((params != null) && (params.length > index)) return params[index] instanceof Class ? (Class) params[index] : null; } return null; } public static Class getActualClass(Object object) { Class c = object.getClass(); if (object instanceof ProxyObject) c = c.getSuperclass(); return c; } public static String[] getParameterNames(Constructor ctor) { return getParameterNames(null, ctor); } public static String[] getParameterNames(Method method) { return getParameterNames(method, null); } private static String[] getParameterNames(Method method, Constructor ctor) { Annotation[][] annotations = method != null ? method.getParameterAnnotations() : ctor.getParameterAnnotations(); String[] names = new String[annotations.length]; /* * boolean allbind = true; loop: for (int i = 0; i < annotations.length; * i++) { Annotation[] arr = annotations[i]; for (Annotation a : arr) { * if (a instanceof Param) { String s = ((Param) a).value(); if * (StringUtils.isNotBlank(s)) { names[i] = s; continue loop; } } } * allbind = false; } if (!allbind) { */ String[] namesDiscovered = method != null ? parameterNameDiscoverer.getParameterNames(method) : parameterNameDiscoverer.getParameterNames(ctor); if (namesDiscovered == null) return null; for (int i = 0; i < names.length; i++) if (names[i] == null) names[i] = namesDiscovered[i]; // } return names; } public static String[] getParameterNames(JoinPoint jp) { if (!jp.getKind().equals(JoinPoint.METHOD_EXECUTION)) return null; Class clz = jp.getTarget().getClass(); MethodSignature sig = (MethodSignature) jp.getSignature(); Method method; try { method = clz.getDeclaredMethod(sig.getName(), sig.getParameterTypes()); if (method.isBridge()) method = BridgeMethodResolver.findBridgedMethod(method); return getParameterNames(method); } catch (Exception e) { return null; } } public static Field getField(Class clazz, String name) throws NoSuchFieldException { try { Field f = clazz.getDeclaredField(name); f.setAccessible(true); return f; } catch (NoSuchFieldException e) { if (clazz == Object.class) throw e; return getField(clazz.getSuperclass(), name); } } @SuppressWarnings("unchecked") public static T getFieldValue(Object o, String name) { try { Field f = getField(o.getClass(), name); return (T) f.get(o); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } public static void setFieldValue(Object o, String name, Object value) { try { Field f = getField(o.getClass(), name); f.set(o, value); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } public static Object getTargetObject(Object proxy) { while (proxy instanceof Advised) { try { return getTargetObject(((Advised) proxy).getTargetSource().getTarget()); } catch (Exception e) { e.printStackTrace(); return proxy; } } return proxy; } public static String getCurrentMethodName() { return Thread.currentThread().getStackTrace()[2].getMethodName(); } }

 

在需要用到反序列化的枚举类上加上注解就行了

@JsonDeserialize(using = JsonEnumDeserializer.class)

 

注意:枚举类上使用了序列化和反序列化的,不能使用JSON工具类来转成进行JAVA类和JSON的相互转换。如果需要进行JSON转换的类,不要使用@JsonSerialize和@JsonDeserialize注解

 

 

之后发现序列化(返回枚举给前端)可以直接使用 @JsonFormat(shape = JsonFormat.Shape.OBJECT)

效果与上面的自定义序列化一样,如果没有特殊要求可以直接使用此注解,就不用写自定义序列化规则了



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有